package com.system.service;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Map;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;



import com.frame.ar.kit.ObjKit;
import com.frame.ar.model.BJUIPager;
import com.frame.ar.util.Coder;
import com.frame.ar.vo.AjaxDone;
import com.frame.config.ParamsConfig;
import com.frame.util.MapUtil;
import com.frame.util.StringUtil;
import com.jfinal.core.Controller;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.IAtom;
import com.jfinal.plugin.activerecord.Page;
import com.jfinal.plugin.activerecord.Record;
import com.system.model.ActionLog;
import com.system.model.User;

/**
 * @author LRC
 * @createDate 2015年5月25日
 * @description 用户信息处理业务处
 */
public class UserInfoService {
	public static String model = "用户管理";
	
	/*******************************************
	 * 功能描述：分页查询
	 *******************************************
	 * @createDate 2015-9-13 by LRC
	 * @param pager
	 * @return 
	 * @updateRecord 格式：时间，作者，修改说明
	 *******************************************
	 * 
	 */
	public static BJUIPager findByPage(BJUIPager pager){
		// 获取分页参数
		Integer pageSize = pager.getPageSize();
		Integer pageIndex = pager.getPageCurrent();
		String from = pager.getQr().getQueryString("from sys_base_user where userCode<>'superAdmin'");
		
		// 查询用户列表
		Page<Record> users = Db.paginate(pageIndex, pageSize, "select * ",
				from, pager.getQr().getValue());
		System.out.println(from);
		System.out.println(Arrays.toString(pager.getQr().getValue()));
		pager.fillPageData(users,10);
		
		return pager;
	}
	
	/*******************************************
	 * 功能描述：删除用户
	 *******************************************
	 * @createDate 2015-9-13 by LRC
	 * @param id
	 * @return 
	 * @updateRecord 格式：时间，作者，修改说明
	 *******************************************
	 * 
	 */
	public static boolean deleteUser(Controller c) {
		JSONArray arr = JSONArray.fromObject(c.getPara("json"));
		for(int i=0; i<arr.size(); i++){
			JSONObject obj = arr.getJSONObject(i);
			String userCode = obj.getString("userCode");
			if(ObjKit.isNull(userCode))return false;
			//获取用户信息
			User u = User.dao.findByUserCode(userCode);
			if(u==null)return false;
			//管理员不能删除
			if("superAdmin".equals(u.get("userCode")))return false;
			u.set("dataStatus", 0).set("deleteTime",new Date()).update();
		}
		return true;
	}
	/*******************************************
	 * 功能描述：彻底删除用户信息
	 *******************************************
	 * @createDate 2015-9-13 by LRC
	 * @param userCode
	 * @return 
	 * @updateRecord 格式：时间，作者，修改说明
	 *******************************************
	 * 
	 */
	public static boolean shiftDeleteUser(Object id) {
		if(ObjKit.isNull(id))return false;
		Object[] ids = null;
		if(id instanceof Object[]){
			ids = (Object[])id;
		}else{
			ids = new Object[]{id};
		}
		for(Object _id : ids){
			//获取用户信息
			final User u = User.dao.findById(_id);
			if(u==null)return false;
			//管理员不能删除
			if("superAdmin".equals(u.get("userCode")))return false;
			if(u.getInt("dataStatus")!=0)return false;
			
			//彻底删除用户  删除用户相关信息
			boolean r = Db.tx(new IAtom() {
				@Override
				public boolean run() throws SQLException {
					boolean r = false;
					
					//删除用户相关信息
					
					
					//最后删除用户
					r = u.delete();
					
					return r;
				}
			});
			if(r==false)return false;
		}
		
		return true;
	}
	/*******************************************
	 * 功能描述：已删除用户回复操作
	 *******************************************
	 * @createDate 2015-9-13 by LRC
	 * @param id
	 * @return 
	 * @updateRecord 格式：时间，作者，修改说明
	 *******************************************
	 * 
	 */
	public static boolean recoverUser(Object id) {
		if(ObjKit.isNull(id))return false;
		Object[] ids = null;
		if(id instanceof Object[]){
			ids = (Object[])id;
		}else{
			ids = new Object[]{id};
		}
		for(Object _id : ids){
			//获取用户信息
			User u = User.dao.findById(_id);
			if(u==null)return false;
			//管理员不能删除
			if("superAdmin".equals(u.get("userCode")))return false;
			u.set("dataStatus", 1).update();
		}
		return true;
	}
	/*******************************************
	 * 功能描述：设置用户状态
	 *******************************************
	 * @createDate 2015-9-13 by LRC
	 * @param userCode
	 * @param status
	 * @return 
	 * @updateRecord 格式：时间，作者，修改说明
	 *******************************************
	 * 
	 */
	public static boolean setUserStatus(String userCode, int status) {
		if(userCode==null||"".equals(userCode.trim())){
			return false;
		}
		// 获取当前操作用户
		User currUser = User.getCurrentUser();
		if (currUser == null)
			return false;
		//正常状态下可以注销，注销状态可以启用
		Integer[] wStatus = null;
		switch(status){
			case -1:wStatus=new Integer[]{1};break;
			case 1:wStatus=new Integer[]{-1,2};break;
			default:return false;
		}
		//更新用户状态
		int rnum = Db.update("update sys_base_user set status=? where userCode=? "
				+ " and status in"+StringUtil.joinIntForIn(wStatus), status,userCode);
		
		//进行其他操作
		
		
		if(rnum>0)return true;
		
		return false;
	}

	/**
	 * @updateTeim 2015年5月27日下午1:25:02
	 * @description 保存用户信息
	 * @param userCode
	 * @param data json字符串
	 * @return
	 */
	public static boolean saveUser(String userCode, Controller c) {
		//查询到目标对象
		if(userCode==null||"".equals(userCode.trim()))return false;
		//获取当前操作用户
		User currUser = User.getCurrentUser();
		if (currUser == null)
			return false;
		
		User u = User.dao.findFirst("select * from sys_base_user "
				+ "where userCode=?", userCode);
		int id = u.getInt("id");
		User update = new User();
		//填充主键
		update.set("id", id);
		String[] args = new String[]{"userName","telephone","address","email"};
		//填充新数据
		MapUtil.copyToModel(c,update, args);
		//获取旧数据
		Record oldData = MapUtil.copyToRecord(u, args);
		oldData.set("id", id);
		//执行更新
		boolean r = update.update();
		// 写入操作日志
		ActionLog.addActionLog(currUser.get("userCode"), model, "信息变更", 
					"sys_base_user", "原数据："+oldData.toJson()+"，新数据："+update.toJson(), null, r);
		
		return r;
	}

	/**
	 * @updateTeim 2015年5月27日下午1:27:46
	 * @description 更改用户登录密码
	 * @param userCode
	 * @param newPassword 
	 * @return
	 */
	public static boolean changeUserPassword(String userCode, String newPassword) {
		if(userCode==null||"".equals(userCode.trim())){
			return false;
		}
		// 获取当前操作用户
		User currUser = User.getCurrentUser();
		if (currUser == null)
			return false;
		
		//获取要操作的目标对象
		User u = User.dao.findFirst("select * from sys_base_user "
				+ "where userCode=?", userCode);
		int id = u.getInt("id");
		User update = new User();
		//填充主键
		update.set("id", id);
		//修改密码
		update.set("password", Coder._encoder(newPassword, userCode));
		
		boolean r = update.update();
		
		//进行其他操作
		
		return r;
	}
	
	/*******************************************
	 * 功能描述：保存数据列表数据
	 *******************************************
	 * @createDate 2015-9-13 by LRC
	 * @param c
	 * @return 
	 * @updateRecord 格式：时间，作者，修改说明
	 *******************************************
	 * 
	 */
	public static boolean saveDataGridUser(Controller c){
		JSONArray arr = JSONArray.fromObject(c.getPara("json"));
		//获取默认密码
		ParamsConfig config = ParamsConfig.getInstance();
		String defalutPassword = config.getValue("System.User.defaultPassword");
		for(int i=0; i<arr.size(); i++){
			JSONObject obj = arr.getJSONObject(i);
			//获取数据ID
			Object id = obj.get("id");
			User u = new User();
			if(ObjKit.isNull(id)){
				//执行新增操作
				//获取父节点信息
				String userCode = obj.getString("userCode");
				//用户登录名空值判定
				if(ObjKit.isNull(userCode))continue;
				//判定是用户是否已经存在
				User _u = User.dao.findByUserCode(userCode);
				if(_u!=null)return false;
				u.set("insertTime", new Date())
				 .set("userCode", userCode)
				 .set("password", Coder._encoder(defalutPassword, userCode))
				 .set("userName", obj.get("userName"))
				 .set("idCard", obj.get("idCard"))
				 .set("status", 1)
				 .set("dataStatus", 1)
				 .set("email", obj.get("email"));
				u.save();
			}else{
				//执行更新操作
				u.set("id", id)
				 .set("userName", obj.get("userName"))
				 .set("idCard", obj.get("idCard"))
				 .set("email", obj.get("email"));
				u.update();
			}
		}
		return true;
	}
	
	
	/*******************************************
	 * 功能描述：获取用户菜单，树形结构
	 *******************************************
	 * @createDate 2015-9-19 by LRC
	 * @param id
	 * @return 
	 * @updateRecord 格式：时间，作者，修改说明
	 *******************************************
	 * 
	 */
	public static List<Map<String,Object>> getUserMenuTree(Object id){
		
		
		return null;
	}
	
	/*******************************************
	 * 功能描述：保存用户菜单权限
	 *******************************************
	 * @createDate 2015-9-19 by LRC
	 * @param ids
	 * @return 
	 * @updateRecord 格式：时间，作者，修改说明
	 *******************************************
	 * 
	 */
	public static AjaxDone saveUserMenu(final Object userId,final Object ids){
		AjaxDone done = new AjaxDone();
		if(ids==null || userId == null)return done;
		boolean r = Db.tx(new IAtom() {
			@Override
			public boolean run() throws SQLException {
				Integer uId = Integer.parseInt(userId.toString());
				//删除记录
				Db.update("delete from sys_base_usermenu where userId=?", uId);
				//从ids中获取菜单id数组
				String[] menuId = ids.toString().split(",");
				List<String> sqls = new ArrayList<String>();
				String sql = "insert into sys_base_usermenu(userId,menuId) values({0},{1})";
				sql = sql.replace("{0}", uId+"");
				for(String id : menuId){
					if(ObjKit.isNull(id))continue;
					Integer mid = Integer.parseInt(id);
					sqls.add(sql.replace("{1}", mid+""));
				}
				if(sqls.size()>0)
					Db.batch(sqls, 100);
				return true;
			}
		});
		done.setStatusCode(r ? AjaxDone.OK : AjaxDone.ERROR);
		return done;
	}
}
